﻿/*d1.编写一个订单管理的控制台程序，实现添加订单、删除订单、修改订单、查询订单（按照订单号、商品名称、客户、订单金额等进行查询）功能。
提示：主要的类有Order（订单）、OrderDetails（订单明细），OrderService（订单服务），订单数据可以保存在OrderService中一个List中。在Program里面可以调用OrderService的方法完成各种订单操作。
要求：
（1）使用LINQ实现各种查询功能，查询结果按照订单总金额排序返回。
（2）在订单删除、修改失败时，能够产生异常并显示给客户错误信息。
（3）作业的订单和订单明细类需要重写Equals方法，确保添加的订单不重复，每个订单的订单明细不重复。
（4）订单、订单明细、客户、货物等类添加ToString方法，用来显示订单信息。
（5）OrderService提供排序方法对保存的订单进行排序。默认按照订单号排序，也可以使用Lambda表达式进行自定义排序。
*/
using System;
using System.Collections.Generic;
using System.Linq;

// 订单明细类
class OrderDetail
{
    public string ProductName { get; set; }
    public double Price { get; set; }
    public int Quantity { get; set; }

    public override string ToString()
    {
        return $"商品名称：{ProductName}，单价：{Price}，数量：{Quantity}";
    }

    public override bool Equals(object obj)
    {
        if (obj is OrderDetail other)
        {
            return this.ProductName == other.ProductName && this.Price == other.Price && this.Quantity == other.Quantity;
        }
        return false;
    }

    public override int GetHashCode()
    {
        return ProductName.GetHashCode() ^ Price.GetHashCode() ^ Quantity.GetHashCode();
    }
}

// 订单类
class Order
{
    public int OrderId { get; set; }
    public string Customer { get; set; }
    public List<OrderDetail> Details { get; set; }
    public double TotalAmount => Details.Sum(d => d.Price * d.Quantity);

    public override string ToString()
    {
        return $"订单号：{OrderId}，客户：{Customer}，订单金额：{TotalAmount}";
    }

    public override bool Equals(object obj)
    {
        if (obj is Order other)
        {
            return this.OrderId == other.OrderId;
        }
        return false;
    }

    public override int GetHashCode()
    {
        return OrderId.GetHashCode();
    }
}

// 订单服务类
class OrderService
{
    private List<Order> orders = new List<Order>();

    // 添加订单
    public void AddOrder(Order order)
    {
        if (orders.Contains(order))
        {
            throw new InvalidOperationException("订单已存在！");
        }
        orders.Add(order);
    }

    // 删除订单
    public void RemoveOrder(int orderId)
    {
        Order order = orders.FirstOrDefault(o => o.OrderId == orderId);
        if (order == null)
        {
            throw new InvalidOperationException("订单不存在！");
        }
        orders.Remove(order);
    }

    // 修改订单
    public void ModifyOrder(Order order)
    {
        Order existingOrder = orders.FirstOrDefault(o => o.OrderId == order.OrderId);
        if (existingOrder == null)
        {
            throw new InvalidOperationException("订单不存在！");
        }
        orders.Remove(existingOrder);
        orders.Add(order);
    }

    // 查询订单（按照订单号、商品名称、客户、订单金额等进行查询）
    public IEnumerable<Order> QueryOrders(Func<Order, bool> predicate)
    {
        return orders.Where(predicate).OrderBy(o => o.TotalAmount);
    }

    // 对保存的订单进行排序，默认按照订单号排序
    public void SortOrders()
    {
        orders.Sort((x, y) => x.OrderId.CompareTo(y.OrderId));
    }
}

class Program
{
    static void Main(string[] args)
    {
        OrderService orderService = new OrderService();

        // 添加订单示例
        Order order1 = new Order
        {
            OrderId = 1,
            Customer = "Alice",
            Details = new List<OrderDetail>
            {
                new OrderDetail { ProductName = "Apple", Price = 5.0, Quantity = 2 },
                new OrderDetail { ProductName = "Banana", Price = 3.0, Quantity = 3 }
            }
        };
        orderService.AddOrder(order1);

        // 查询订单示例
        var queryResult = orderService.QueryOrders(o => o.Customer == "Alice");
        foreach (var order in queryResult)
        {
            Console.WriteLine(order);
            foreach (var detail in order.Details)
            {
                Console.WriteLine(detail);
            }
        }

        Console.ReadLine();
    }
}
